package br.com.cast.conexao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import br.com.cast.modelo.Selecao;

@Component
public class SelecaoDAO {

	@Autowired
	private DataSource dataSource;
	
	private Connection conexao;
	
	public SelecaoDAO(){
	}
	
	public void salvar(Selecao s){
		
		String sql = "insert into selecao"
				+ "(nome, id_grupo, is_cabeca_chave, quantidade_titulo) "
				+ "values(?, ?, ?, ?)";
		
		try {
			PreparedStatement pst = getConnection().prepareStatement(sql);
			
			pst.setString(1, s.getNome());
			pst.setInt(2, s.getGrupo().getNumero());
			pst.setBoolean(3, s.isIs_cabeca_chave());
			pst.setInt(4, s.getQuantidade_titulo());
			
			pst.execute();
			
			pst.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
			throw new RuntimeException("Erro");
		}
		
	}
	
	public long total() {
		String sql = "SELECT COUNT(*) as total "
				+ "FROM selecao";

		Long total = null;
		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ResultSet rs = ps.executeQuery();
			
			if (rs.next()) {
				total = rs.getLong("total");			
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
		return total;
	}
	
	
public Iterator<Selecao> consultaPaginada(long inicio, long fim) {
		
		List<Selecao> pessoas = new ArrayList<>();
		
//		String sql = "SELECT * FROM ("
//						+ " SELECT *, ROW_NUMBER()"
//						+ " OVER (ORDER BY id) as row"
//						+ " FROM selecao"
//					+ ") a WHERE a.row > ? and a.row <= ?";
		
		
		String sql = "SELECT * FROM ("
				+ " SELECT s.id, s.nome, g.nome as Grupo, s.quantidade_titulo, ROW_NUMBER() OVER (ORDER BY s.id) as row FROM selecao s "
				+ "inner join grupo g on s.id_grupo = g.id)"
				+ " a WHERE a.row > ? and a.row <= ?";

		
		try {
			PreparedStatement ps = getConnection().prepareStatement(sql);
			
			ps.setLong(1, inicio);
			ps.setLong(2, fim);
			
			ResultSet rs = ps.executeQuery();
			
			while (rs.next()) {
				
				Selecao s = new Selecao();
				s.setId(rs.getInt("id"));
				s.setNome(rs.getString("nome"));
				s.setNomeGrupo(rs.getString("Grupo"));
				s.setQuantidade_titulo(rs.getInt("quantidade_titulo"));
				
				pessoas.add(s);
			}
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
		return pessoas.iterator();
	}
	
	public void excluir(int id) {
		String sql = "DELETE FROM selecao where id = ?";

		try {
			PreparedStatement pst = getConnection().prepareStatement(sql);
			pst.setInt(1, id);

			pst.execute();

		} catch (SQLException e) {
			throw new RuntimeException("Nao foi possivel deletar");
		}
	}
	
	public void alterar(Selecao selecao) {
		String sql = "update selecao set nome = ?, id_grupo = ?, quantidade_titulo = ? "
					+ "where id = ?";
		
		try {
			PreparedStatement pst = getConnection().prepareStatement(sql);
			
			pst.setString(1, selecao.getNome());
			pst.setInt(2, selecao.getGrupo().getNumero());
			pst.setInt(3, selecao.getQuantidade_titulo());
			
			pst.setInt(4, selecao.getId());
			
			
			pst.execute();
			
			pst.close();
			
		} catch (SQLException e) {
			throw new RuntimeException("nao foi possivel alterar");
		}
	}
	
	
//	public void confereChave(){
//		
//		String sql = "select id from selecao where is_chave_cabeca "
//	}
	
	
	public Connection getConnection(){
		if(conexao == null){
			try {
				return conexao = dataSource.getConnection();
			} catch (SQLException e) {
				e.printStackTrace();
				throw new RuntimeException("Não foi Possivel Conectar!");
			}
		}
		return conexao;
	}
	
}
